/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package xmppbot.funcs;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import org.jivesoftware.smack.XMPPException;
import xmppbot.Main;
import xmppbot.parse.options;
import xmppbot.parse.utils;

/**
 *
 * @author lian
 */
abstract public class sessionfuncs extends utils implements func,session,Runnable {         
    // Статусы сессии
    public static final String CLEAR = "clear";      // сессия не задана
    public static final String READY = "ready";      // ожидает новых данных
    public static final String RUN = "run";          // обрабатывает очередь пакетов
    public static final String CLOSING = "closing";  // сессия завершается
    public static final String CLOSE = "close";      // сессия завершона
    public static final String ERROR = "error";      // ошибка сессии (сессии с таким статусом автоматически удаляются каждые 5 мин)
    private String status = CLEAR; 
    private Thread thread;
    private packetCollector coll;
    protected options opts;
    HashMap<String, ArrayList<session>> sessions = Main.sessions;
    
    public void run () {
        
    }

    public String process(options opts) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String processnotallowed(options opts) throws SQLException {
        return null;
    }

    public void session(options opts) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void openSession(options opts) {
        this.opts = opts;
        coll = new packetCollector();
        thread = new Thread(thread, opts.getFrom());
        if (sessions.containsKey(opts.getFrom())) {
            sessions.get(opts.getFrom()).add(this);
        } else {
            @SuppressWarnings("unchecked")
            ArrayList<session> arr = new ArrayList();
            arr.add(this);
            sessions.put(opts.getFrom(), arr);
        }
        thread.start();
        setStatus(READY);
    }

    public void closeSession() {
        setStatus(CLOSING);
        int i = 60;
        while (!getStatus().equals(CLOSE) && i != 0) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void addPacket(options opts) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Thread getThread() {
        return thread;
    }

    @SuppressWarnings("deprecation")
    public void killSession() {
        thread.stop();
    }

    abstract public void close();

    @Override
    public void ansver(String ansver) {
        try {
            ans(opts, ansver);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (XMPPException ex) {
            ex.printStackTrace();
        }
        close();
    }

    @Override
    public void ansver() {
        try {
            ans(opts, opts.getAnsver());
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (XMPPException ex) {
            ex.printStackTrace();
        }
    }
}
